package cn.biplam.front.template.callback.tree;

import cn.biplam.common.tools.TOOLS;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.front.template.base.HiddenParams;
import cn.biplam.front.template.callback.TreeCallBack;

/**
 * 数据探查任务管理树—回调器
 * @author XiaoRuxing 2009-7-4上午10:49:50
 * @version 1.0
 */
public class DbsTaskTreeCallBack implements TreeCallBack{

	/**左键 目标容器id */
	private String targetId;
	/**左键 行为id */
	private String actionId;
	/**业务标识字段，回调中根据部同的业务标识扩展树 */
	private String businessFlag;
	/**需要提交的容器 */
	private String otherContainer;
	
	/**
	 * 业务标识枚举类型定义
	 */
	public enum Task_Bussiness_Type{
		
		/**采用默认的方式，主题绑定展开脚本，Table绑定目标刷新脚本 */
		Default("1"),
		/**非根主题维护,此主题可以在根主题上新建，在非根主题上修改删除 */
		SubjectBindTarget("2");

		private String value;
		private Task_Bussiness_Type(String value){this.value=value;}
		public String toString() {return value;}
	}
	
	/**
	 * 业务标识枚举类型定义
	 */
	public enum Task_Operator_Type{
		
		/** 任务状态 */
		Status("1"),
		/** 主题 */
		Theme("2"),
		/** 任务 */
		Task("3");

		private String value;
		private Task_Operator_Type(String value){this.value=value;}
		public String toString() {return value;}
	}
	
	/**
	 * 构造函数 
	 * @param targetId   左键 目标容器id
	 * @param actionId   左键 行为id
	 */
	public DbsTaskTreeCallBack(String targetId,String actionId){
		this(targetId,actionId,Task_Bussiness_Type.Default.toString());
	}
	
	/**
	 * 构造函数 
	 * @param targetId   左键 目标容器id
	 * @param actionId   左键 行为id
	 * @param businessFlag  业务行为标识，用来区分设置节点同一类型时的不同动作
	 */
	public DbsTaskTreeCallBack(String targetId,String actionId,String businessFlag){
		this.targetId = targetId;
		this.actionId = actionId;
		this.businessFlag = businessFlag;
	}

	/**
	 * 根据树的节点类型、是否是叶子节点、节点ID 返回节点的左键脚本
	 *  1.判断是否是叶子节点，如果不是叶子节点，单击操作时绑定"展开"和"收起"动作
	 *  2.根据节点操作类型绑定左键的指定目标区域刷新动作
	 * @param operatorType  节点类型
	 * @param isLeaf        是否是叶子节点
	 * @param nodeId        节点ID
	 * @return  节点图片名称
	 * @throws ErrorMessage 
	 */
	public String getLeftClickScript(String operatorType, 
									 boolean isLeafs,
			                         String nodeId,
			                         int level,
			                         int levelDown) throws ErrorMessage {
		StringBuilder sp = new StringBuilder();
		if(!isLeafs){
			//绑定"展开"和"收起"动作
			this._bindExtend(sp, nodeId, level, levelDown);
		}
		this.otherContainer = HiddenParams.hiddenId+nodeId.split(",")[0];
		if(Task_Operator_Type.Task.toString().equals(operatorType)){
			//绑定左键的指定目标区域刷新动作,realId
			this.bindRefresh(sp, nodeId.split(",")[1]);
		}else{
			if(Task_Bussiness_Type.SubjectBindTarget.toString().equals(this.businessFlag)){
				//绑定左键的指定目标区域刷新动作,realId
				this.bindRefresh(sp, nodeId.split(",")[7]);
			}
		}
		
		return sp.toString();
	}
	
	/**
	 * 根据树的节点类型和是否是叶子节点返回节点图片名称
	 * 非叶子节点的图片必须有两张 picName(收起后显示的图片)和opicName(展开后显示的图片)
	 * 叶子节点的图片和主题叶子节点的图片是一张 picName(收起和展开显示同一图片)
	 * @param operatorType  节点操作类型
	 * @param isLeaf        是否是叶子节点
	 * @return  节点图片名称
	 * @throws ErrorMessage 
	 * @throws ErrorMessage 
	 * @throws ErrorMessage 
	 */
	public String getNodePic(String operatorType, boolean isLeaf) throws ErrorMessage {
		//判断节点类型
		switch(TOOLS.stringToInt(operatorType)){
		case 1://状态
		case 2://主题
			return this.getNodePicSubject(isLeaf);
		case 3://任务
			return this.getNodePicTable(isLeaf);
		default:
			throw new ErrorMessage("DataExploreTaskTreeCallBack.java ,operatorType is not found:"+operatorType+"!");
		}
	}
	
	/**
	 * 取主题的图片
	 * @return
	 */
	private String getNodePicSubject(boolean isLeaf){
		String picName = null;
		if(isLeaf){
			picName = "dufl.gif";
		}else{
			picName = "duf.gif";
		}
		return picName;
	}
	
	/**
	 * 取业务对象的图片
	 * @return
	 */
	private String getNodePicTable(boolean isLeaf){
		String picName = null;
		if(isLeaf){
			picName = "df.gif";
		}else{
			picName = "df.gif";
		}
		return picName;
	}
	
	/**
	 * 绑定左键的"展开"和"收起"动作
	 * @throws ErrorMessage 
	 */
	private void _bindExtend(StringBuilder sp,String nodeId,int level,int levelDown) throws ErrorMessage{
		//拼接图片id 结构为:aid,nodeId,nodeType
		String imageID = this.getImageIdByNodeId(nodeId, level, levelDown);
		sp.append("tk('");
		sp.append(imageID);
		sp.append("','");
		sp.append(nodeId.split(",")[0]);
		sp.append("');");
	}
	
	/**
	 * 根据nodeId取节点的图片id
	 * @param nodeId  节点id
	 * @param level   节点级别
	 * @param levelDown  从当前节点向下取几级
	 * @return  图片名称
	 * @throws ErrorMessage
	 */
	private String getImageIdByNodeId(String nodeId,int level,int levelDown) throws ErrorMessage{
		String imageId = "";
		//节点图片标志 c:展开图片，及加号  e为收起图片，及减号
		String imageFlag = "c";
		//当前节点级别小于要向下展开的级别时，隐藏的图片是 加号图片，点击时的图片则是 减号
		if(level<levelDown){
			imageFlag = "e";
		}
		String[] arrNodeId = nodeId.split(",");
		if(arrNodeId!=null && arrNodeId.length>3){
			imageId = nodeId +","+ imageFlag;
		}else{
			throw new ErrorMessage("DataExploreTaskTreeCallBack.java,nodeId is incorrect");
		}
		return imageId;
	}
	
	/**
	 * 绑定左键刷新目标区域脚本
	 * @param sp      脚本字符串
	 * @param nodeId  节点id
	 */
	private void bindRefresh(StringBuilder sp,String nodeId){
		sp.append("tl(this.id,'"+this.actionId+"','"+nodeId+"','"+this.targetId+"','"+this.otherContainer+"');");
	}
	
	/**
	 * 取左键的目标容器id
	 * @return
	 */
	public String getLeftClickActionId() {
		return this.actionId;
	}
	
	/**
	 * 取左键的行为id
	 * @return
	 */
	public String getLeftClickTargetId() {
		return this.targetId;
	}

	/**
	 * 业务标识字段，回调中根据部同的业务标识扩展树
	 * @return
	 */
	public String getBusinessType() {
		return this.businessFlag;
	}
}
